import java.awt.Container;
import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
import java.util.ArrayList;
import javax.swing.border.TitledBorder;

public class FenetrePrincipale extends JFrame implements ActionListener {

  private JMenuItem miQuit;
  private JMenuItem miNouvL;
  private JMenuItem miAffiche;
  private JMenuItem miNouvE;
  private JMenuItem miRechE;
  private JMenuItem miNouvC;
  private JMenuItem miRechC;
  private JMenuItem miNouvU;
  private JMenuItem miRechU;
  private JMenuItem miSupprListe;
  private JMenuItem miModifListe;
  private JPanel pRes;
  private JPanel pOutil;
  private JTable tRes;
  private JButton bMod;
  private JButton bSup;
  private JButton bCrea;
  private JButton bQuit;
  private Container contenu;
  private ButtonGroup bg;
  private JScrollPane scroll;

  private Authentification nom;
  
  public FenetrePrincipale() {

    super("Gestionnaire de listes");
    this.setLayout(null);

    // Ajout des menus 

    JMenuBar mb = new JMenuBar();
    this.setJMenuBar(mb);

    // Menus principaux
    JMenu mFich = new JMenu("Application");
    JMenu mListe = new JMenu("Listes");
    JMenu mItem = new JMenu("Eléments");
    JMenu mCat = new JMenu("Catégories");
    JMenu mUser = new JMenu("Utilisateur");

    // Ajout à la barre
    mb.add(mFich);
    mb.add(mListe);
    mb.add(mItem);
    mb.add(mCat);
    mb.add(mUser);

    // Ajout des sous menus
    this.miQuit = new JMenuItem("Quitter");
    this.miQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 2));
    this.miQuit.addActionListener(this);

    this.miNouvL = new JMenuItem("Créer...");
    this.miNouvL.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 2));
    this.miNouvL.addActionListener(this);

    this.miNouvE = new JMenuItem("Créer...");
    this.miNouvE.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 1));
    this.miNouvE.addActionListener(this);

    this.miRechE = new JMenuItem("Rechercher...");
    this.miRechE.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 1));
    this.miRechE.addActionListener(this);

    this.miNouvC = new JMenuItem("Créer...");
    this.miNouvC.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 8));
    this.miNouvC.addActionListener(this);

    this.miRechC = new JMenuItem("Rechercher...");
    this.miRechC.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 8));
    this.miRechC.addActionListener(this);

    this.miNouvU = new JMenuItem("Modifier...");
    this.miNouvU.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 10));
    this.miNouvU.addActionListener(this);

    this.miRechU = new JMenuItem("Supprimer...");
    this.miRechU.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 10));
    this.miRechU.addActionListener(this);

    this.miSupprListe = new JMenuItem("Supprimer...");
    this.miSupprListe.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0));
    this.miSupprListe.addActionListener(this);

    this.miModifListe = new JMenuItem("Modifier...");
    this.miModifListe.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, 0));
    this.miModifListe.addActionListener(this);

    this.pRes = new JPanel(null, false);
    this.pRes.setBorder(new TitledBorder(null, "Resultat", TitledBorder.LEFT, TitledBorder.DEFAULT_POSITION));

    this.pOutil = new JPanel(null, false);
    this.pOutil.setBorder(new TitledBorder(null, "Outils", TitledBorder.LEFT, TitledBorder.DEFAULT_POSITION));


    // Chargement du tableau des listes
    this.loadTableau(true);

    // Ajout des boutons de la fenêtre
    this.bMod = new JButton("Modifier");
    this.bMod.addActionListener(this);

    this.bCrea = new JButton("Créer");
    this.bCrea.addActionListener(this);

    this.bSup = new JButton("Supprimer");
    this.bSup.addActionListener(this);

    this.bQuit = new JButton("Quitter");
    this.bQuit.addActionListener(this);

    this.contenu = this.getContentPane();
    this.contenu.setLayout(null);

    // Ajout des composants aux panneaux 
    this.pOutil.add(this.bMod);
    this.pOutil.add(this.bQuit);
    this.pOutil.add(this.bSup);
    this.pOutil.add(this.bCrea);
    this.contenu.add(this.pRes);
    this.contenu.add(this.pOutil);
    mFich.add(miQuit);
    mListe.add(miNouvL);
    mListe.add(miSupprListe);
    mListe.add(miModifListe);
    mItem.add(miNouvE);
    mItem.add(miRechE);
    mCat.add(miNouvC);
    mCat.add(miRechC);
    mUser.add(miNouvU);
    mUser.add(miRechU);

    // Définition des positionnements
    this.pRes.setBounds(10, 10, 450, 520);
    this.pOutil.setBounds(475, 10, 150, 220);
    this.bCrea.setBounds(25, 30, 100, 20);
    this.bMod.setBounds(25, 80, 100, 20);
    this.bSup.setBounds(25, 130, 100, 20);
    this.bQuit.setBounds(25, 180, 100, 20);

    this.setBounds(50, 50, 650, 600);
    this.setVisible(true);
    this.setResizable(false);

    this.setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE); // Opération par défaut de la croix

    // Dès l'ouverture, on demande le login ou propose une inscription
    this.nom = new Authentification();
    do {
      if (nom.ok == false) {
        this.nom = new Authentification();
      }
    } while (this.nom.ok == false);
  }

  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == this.bQuit || e.getSource() == miQuit) {
      System.exit(0);
    } else if (e.getSource() == miNouvL) {
      AjoutListe al = new AjoutListe();
    } else if (e.getSource() == miNouvE) {
      AjoutElement ae = new AjoutElement();
    } else if (e.getSource() == miRechE) {
      SelectionElement se = new SelectionElement();
    } else if (e.getSource() == miNouvC) {
      this.createCateg();
    } else if (e.getSource() == miRechC) {
        SelectionCategorie sc = new SelectionCategorie();
    } else if (e.getSource() == miNouvU) {
      this.modifLogin();
    } else if (e.getSource() == this.bCrea) {
      AjoutListe fenAjout = new AjoutListe();
      this.loadTableau(false);
    } else if (e.getSource() == this.bMod || e.getSource() == this.miModifListe) {
      this.modifListe();
    } else if (e.getSource() == this.bSup || e.getSource() == this.miSupprListe) {
      this.supprListe();
    } else if (e.getSource() == miRechU) {
      // Modification de la fontion pour rendre le menu effectif.
        int confirm = JOptionPane.showConfirmDialog(this, "En supprimant votre compte, vous serez déconnecté.\nÊtes-vous sûr de vouloir le faire ?", "Suppression de compte", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
        if (confirm == JOptionPane.YES_OPTION)
        {
            try
            {
                bdd db = bdd.getInstance();
                String log = nom.logUsr;
                User usr = User.getUser(log);
                int nb = db.update("UPDATE ap4_sp_ligneListe SET resp=1 WHERE resp=" +usr.getId());
                usr.delete();
                JOptionPane.showMessageDialog(this, "La suppression a bien été effectuée !\nVous allez être déconnecté.", "Suppression réussie :)", JOptionPane.INFORMATION_MESSAGE);
                nom.ok = false;
                do {
                  if (nom.ok == false) {
                    this.nom = new Authentification();
                  }
                } while (this.nom.ok == false);
            } catch (SQLException ex) {JOptionPane.showMessageDialog(this, "Une erreur est survenue lors de la suppression.", "Erreur", JOptionPane.ERROR_MESSAGE); }
        }
    }
  }

  private void modifLogin() {
      try {
          bdd db = bdd.getInstance();
          String formerName = nom.logUsr;
          String newName = JOptionPane.showInputDialog(this, "Nouveau login : ", "Modifier mon compte", JOptionPane.QUESTION_MESSAGE);
          if (newName.equals("")) {
              JOptionPane.showMessageDialog(this, "Vous devez spécifier un nouveau login.", "Erreur", JOptionPane.ERROR_MESSAGE);
              modifLogin();
          } else {
              db.update("UPDATE ap4_sp_user SET nom='" +newName+ "' WHERE nom='" +formerName+ "'");
              JOptionPane.showMessageDialog(this, "La modification a été enregistrée.\nVous allez être déconnecté.", "Modification réussie", JOptionPane.INFORMATION_MESSAGE);
              nom.ok = false;
              do {
                if (nom.ok == false) {
                  this.nom = new Authentification();
                }
              } while (nom.ok == false);
          }
      } catch (SQLException ex) { JOptionPane.showMessageDialog(this, "Une erreur est survenue.", "Erreur", JOptionPane.ERROR_MESSAGE); }
  }

  private void createCateg() {
    String nomCat = new String();
    nomCat = JOptionPane.showInputDialog(this, "Nom de la Catégorie", "Ajout d'une Catégorie", JOptionPane.QUESTION_MESSAGE);
    if(nomCat != null){
	    try {
	      Categorie c = new Categorie(nomCat);
	      JOptionPane.showMessageDialog(this, "Insertion de " + c.getNom() + " réussie !", "Ajout de catégorie", JOptionPane.INFORMATION_MESSAGE);
	    } catch (SQLException exp) {
	      JOptionPane.showMessageDialog(this, "Problème à l'insertion :(", "Ajout de catégorie", JOptionPane.ERROR_MESSAGE);
	    }
	}
  }

  private void modifListe() {
    int selection = this.tRes.getSelectedRow();
    if (selection >= 0) {
      if (this.tRes.getSelectedRowCount() == 1) {
        GererListe gl = new GererListe(this.getSelectedListe(selection));
      } else {
        JOptionPane.showMessageDialog(this, "Vous ne pouvez sélectionner qu'une seule liste", "Modifier la liste", JOptionPane.ERROR_MESSAGE);
      }
    } else {
      JOptionPane.showMessageDialog(this, "Vous devez sélectionner une liste", "Modifier la liste", JOptionPane.ERROR_MESSAGE);
    }
  }

  private void supprListe() {
    int selection = this.tRes.getSelectedRow();
    if (selection >= 0) {
      if (this.tRes.getSelectedRowCount() == 1) {
        int confirm = JOptionPane.showConfirmDialog(this, "Êtes-vous sûr de vouloir supprimer cette liste ?", "Supprimer la liste", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
        if (confirm == JOptionPane.OK_OPTION) {
          try {
            getSelectedListe(selection).delete();
            loadTableau(false);
          } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, "La suppression n'a pas pu aboutir.", "Supprimer la liste", JOptionPane.ERROR_MESSAGE);
          }
        }
      } else {
        JOptionPane.showMessageDialog(this, "Vous ne pouvez sélectionner qu'une seule liste.", "Supprimer la liste", JOptionPane.ERROR_MESSAGE);
      }
    } else {
      JOptionPane.showMessageDialog(this, "Vous devez sélectionner une liste.", "Supprimer la liste", JOptionPane.ERROR_MESSAGE);
    }
  }

  public Liste getSelectedListe(int selection) {
    return new Liste(Integer.parseInt((String) this.tRes.getValueAt(selection, 0)), (String) this.tRes.getValueAt(selection, 1), new Date((String) this.tRes.getValueAt(selection, 2)));
  }

  public void loadTableau(boolean callFromConstructor) {
    String[] colonnes = new String[]{"Id", "Nom", "Date butoire"};

    ArrayList<Liste> listes = null;
    try {
      listes = Liste.chargerListes();
    } catch (SQLException e) {
      JOptionPane.showMessageDialog(this, "Erreur dans le chargement des listes \n" + e, "Erreur BDD", JOptionPane.ERROR_MESSAGE);
    }

    Object[][] listesTab = new String[listes.size()][3];
    int i = 0;
    for (Liste l : listes) {
      listesTab[i] = new String[]{String.valueOf(l.getListID()), l.getNom(), l.getDateButoire().toString()};
      i++;
    }

    // On met à jour le tableau en enlevant l'ancien et en le reconstruisant

    if (!callFromConstructor) {
      this.pRes.remove(this.scroll);
    }

    this.tRes = new JTable(listesTab, colonnes);
    this.scroll = new JScrollPane(this.tRes);
    this.scroll.createVerticalScrollBar();

    this.pRes.add(this.scroll);

    this.scroll.setBounds(10, 30, 430, 480);
    this.scroll.createVerticalScrollBar();
  }
}
